package safe;

import java.util.concurrent.TimeUnit;

/**
 * @author lzm
 * @date 2025/2/20 20:02
 * @description 多线程版的累加器，解决线程不靠谱问题
 */
public class AdderV2 {

    int[] arr = new int[5];

    /**
     * 多线程版的累加器
     */
    public void add() {
        for (int j = 0; j < 5; j++) {
            new Thread(new Task(j, arr), "线程-" + j).start();
        }
    }


    public static void main(String[] args) throws InterruptedException {
        AdderV2 adder = new AdderV2();
        adder.add();
        // 这里睡一秒是为了防止线程还没执行完就输出结果
        TimeUnit.SECONDS.sleep(1);
        // 将数组中所有变量的值相加，得到最终的结果
        int sum = 0;
        for (int j = 0; j < adder.arr.length; j++) {
            sum += adder.arr[j];
        }
        System.out.println("计算结果是：" + sum);
    }

}

/**
 * 任务类，实现变量的累加1万次任务
 */
class Task implements Runnable {

    // 任务编号，用于保存要执行的任务，这里是数组中某个变量的索引
    int taskId;

    // 该输入用于保存所有任务
    int[] arr;

    public Task(int taskId, int[] arr) {
        this.taskId = taskId;
        this.arr = arr;
    }

    @Override
    public void run() {
        for (int j = 0; j < 10000; j++) {
            // 只操作数组中某个特定索引的变量值
            arr[taskId]++;
        }
    }
}
